<?php
	include_once 'jour.class.php';
	class Semaine
	{
		private $listeJours;
		private $listeDateJours;
		private $debSemaine;
		private $finSemaine;
		public function __construct($dateSemaine)
		{
			$jourSemaine = str_replace('0', '7', date('w',$dateSemaine));
			$this->debSemaine=strtotime(date('Y-m-d',$dateSemaine).' 00:00:00 -'.($jourSemaine-1).' DAY');
			$this->finSemaine=strtotime(date('Y-m-d',$dateSemaine).'23:59:59 +'.(7-$jourSemaine).' DAY');
			$this->listeDateJours[]=$this->debSemaine;
			$this->listeJours[] = new Jour($this->listeDateJours[0]);
			for($i=1;$i<7;$i++)
			{
				$this->listeDateJours[]=strtotime(date('Y-m-d',$this->listeDateJours[0]).' 00:00:00 +'.$i.' DAY');
				$this->listeJours[]= new Jour($this->listeDateJours[$i]);
			}
		}
		public function __get($name)
			{
			if(property_exists(get_class(), $name))
			{
				return $this->$name;
			}
		}
		function listeElemEvent()
		{
			foreach($this->listeJours as $jour)
			{
				$jour->listeElemEvent();
			}
		}
		/*
		 * Méthode afficher() : Permet d'afficher les événements de la semaine dans un tableau <table class="tableSemaine">
		 * Le tout est contenu dans <div class = "divSemaine">
		 */
		public function afficher()
		{
			$week =date('W', $this->debSemaine)-date('W') ;
			echo "<div class='divSemaine'>";
			echo "<div class='titreSemaine'>";
			echo "<a href='calendrier.php?week=".($week-1)."'><<</a>";
			echo "Semaine ".date('W',$this->debSemaine)."(du ".date('d/m/Y',$this->debSemaine)." au ".date('d/m/Y',$this->finSemaine).")<a href='calendrier.php?week=".($week+1)."'>>></a></div><br/>";
			echo '<table class = "tableSemaine"><tr>'; 
			$i=0;
			foreach($this->listeDateJours as $dateJour)
			{
				echo "<th><a href='calendrier.php?jour=".$dateJour."'>".date('d/m/Y',$dateJour)."</a></th>";
				$i++;
			}
			echo "</tr>";
			foreach($this->listeJours as $jour)
			{
				$jour->afficher();	
			}
			echo "</table>";
			echo "</div>";
		}
		/*
		 * Methode EventExiste : Permet de vérifier si un événement correspondant au même ID_Element que celui présent dans $eltAct durant la même période existe déjà.
		 * $eltAct : Type ChauffageAct ou StoreAct
		 * Renvoie un booléen. 
		 */
		public function EventExiste($eltAct)
		{
			$deb = date('Y-m-d H:i:s', $eltAct->Debut);
			$fin = date('Y-m-d H:i:s', $eltAct->Fin->Debut);
			$pdo=SPDO::pdo();
			$requeteVerif = $pdo->query("SELECT * FROM Evenement E1, Evenement E2, ActionElement WHERE E1.ID_ActionElement=ActionElement.ID_ActionElement AND ActionElement.ID_Element=".$eltAct->ID_Element." AND E1.Fin=E2.ID_Evenement AND ((E1.Debut<='".$deb."' AND E2.Debut>='".$deb."') OR (E1.Debut<='".$fin."' AND E2.Debut>='".$fin."') OR (E1.Debut BETWEEN '".$deb."' AND '".$fin."') OR (E2.Debut BETWEEN '".$deb."' AND '".$fin."'))");
			$resultVerif = $requeteVerif->fetchAll();
			if(count($resultVerif)>0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		/*
		 * Methode ajouterEvent() : Fonction insérant les informations de $eltAct dans la base de données.
		 * $eltAct : Type ChauffageAct ou StoreAct
		 * Renvoie 0 en cas de succès, 1 si l'insertion a échoué, 2 si un événement concernant le même ID_Element et la même période éxiste déjà
		 */
		public function ajouterEvent($eltAct)
		{
			if(!$this->EventExiste($eltAct))
			{
				$pdo = SPDO::pdo();
				try 
				{
					$pdo->beginTransaction();
					$ajoutActionElemFin = $pdo->exec("INSERT INTO ActionElement VALUES('',".$eltAct->ID_Element.")");//Ajout ActionElem de fin
					$idActionElement = $pdo->lastInsertId();
					if(get_class($eltAct)=='ChauffageAct')//Ajout de ActionStore ou Chauffage de fin
					{
						$ajoutActionChauffFin = $pdo->exec("INSERT INTO ActionChauffage VALUES('',".$eltAct->Fin->Etat.",".$eltAct->Fin->Temperature.",".$idActionElement.")");					
					}
					else if(get_class($eltAct)=='StoreAct')
					{
						$ajoutActionStoreFin = $pdo->exec("INSERT INTO ActionStore VALUES('',".$eltAct->Fin->Position.",".$idActionElement.")");
					}
					else
					{
						throw new Exception();
					}
					$ajoutEvenementFin = $pdo->exec("INSERT INTO Evenement VALUES('',".$idActionElement.",'".date('Y-m-d H:i:s',$eltAct->Fin->Debut)."',NULL)");//Ajout de Evenement de fin[fin = NULL]
					$idEvenementFin = $pdo->lastInsertId();
					$ajoutActionElemDeb = $pdo->exec("INSERT INTO ActionElement VALUES('',".$eltAct->ID_Element.")");//Ajout de ActionElem de debut
					$idActionElement = $pdo->lastInsertId();
					if(get_class($eltAct)=='ChauffageAct')//Ajout de ActionStore ou ActionChauffage de debut
					{
						$ajoutActionChauffDeb = $pdo->exec("INSERT INTO ActionChauffage VALUES('',".$eltAct->Etat.",".$eltAct->Temperature.",".$idActionElement.")");
					}
					else if(get_class($eltAct)=='StoreAct')
					{
						$ajoutActionStoreDeb = $pdo->exec("INSERT INTO ActionStore VALUES('',".$eltAct->Position.",".$idActionElement.")");
					}
					$ajoutEvenementDeb = $pdo->exec("INSERT INTO Evenement VALUES('',".$idActionElement.",'".date('Y-m-d H:i:s',$eltAct->Debut)."',".$idEvenementFin.")");//Ajout de Evenement de debut[fin = Evenement de fin]
					$pdo->commit();
					return 0;
				}
				catch (Exception $e)
				{
					$pdo->rollBack();
					return 1;
				}
			}
			else
			{
				return 2;
			}
		}
		/*
		*Methode majEvent : Prépare l'insertion des requêtes dans la base de données.
		*Renvoie 0 si l'insertion est effectuée, 1 en cas d'échec lors de l'insertion, 2 si un événement correspondant au même ID_Element dans la même période de temps existe déjà.
		*/
		public function majEvent()
		{
			$pdo = SPDO::pdo();
			$debut = strtotime(intval($_POST['anneeDeb']).'-'.intval($_POST['moisDeb']).'-'.intval($_POST['jourDeb'])." ".intval($_POST['heureDeb']).':'.intval($_POST['minDeb']).':'.intval($_POST['secDeb']));
			$fin = strtotime(intval($_POST['anneeFin']).'-'.intval($_POST['moisFin']).'-'.intval($_POST['jourFin'])." ".intval($_POST['heureFin']).':'.intval($_POST['minFin']).':'.intval($_POST['secFin']));
			$result = 3;			
			$listePiece = unserialize($_SESSION['utilisateur'])->piece;
			foreach($listePiece as $piece)
			{
				if(count($piece->equipement) != 0)
				{
					foreach($piece->equipement as $equipement)
					{
						if(get_class($equipement)=='Chauffage')
						{
							$requete = $pdo->query("SELECT * FROM Chauffage WHERE ID_Element = ".$equipement->IDElement);
							$resultChauff = $requete->fetchAll();
							if(count($resultChauff)>0)
							{
								$chauffEtat = 0;
								if($_POST['chauffEtat'.$equipement->ID]=='on')
								{
									$chauffEtat = 1;
								}
								if(($_POST['chauffTemp'.$equipement->ID]!=$resultChauff[0]['Temperature'])||($chauffEtat!=$resultChauff[0]['Etat']))
								{
									$chauffActFin = new ChauffageAct($equipement->IDElement, $fin, null,$resultChauff[0]['Temperature'], $resultChauff[0]['Etat'],null);
									$chauffActDeb = new ChauffageAct($equipement->IDElement, $debut ,$chauffActFin, $_POST['chauffTemp'.$equipement->ID], $chauffEtat,null);
									$result = $this->ajouterEvent($chauffActDeb);
								}
							}
						}
						else if(get_class($equipement)=='Store')
						{
							if($_POST['storePosition'.$equipement->ID]!=$equipement->position)
							{
								$requete = $pdo->query("SELECT * FROM Stores WHERE ID_Element =".$equipement->IDElement);
								$resultStore = $requete->fetchAll();
								if(count($resultStore)>0)
								{
									$storeActFin = new StoreAct($equipement->IDElement, $fin, null, $resultStore[0]['Position'], null);
									$storeActDeb = new StoreAct($equipement->IDElement, $debut, $storeActFin, $_POST['storePosition'.$equipement->ID],null);
									$result = $this->ajouterEvent($storeActDeb);
								}
							}
						}
					}
				}
			}
			$this->listeElemEvent();
			return $result;
		}
	}
?>

